package paintingPlan;

public class Solution {
    public int paintingPlan(int n, int k) {
        // 求出当前能取多少行 多少列
        // c行l列 n*c + (n-c)*l 格子数目
        if(n*n==k){
            return 1;
        }
        int count = 0;
        for (int c = 0; c <= n; c++) {
            for (int l = 0; l <= n; l++) {
                if(n*c+(n-c)*l == k){
                    count+=getCount(c,l,n);
                }
            }
        }
        return count;
    }
    // 获取排列组合的数目
    private int getCount(int c,int l,int n){
        // 抽取c行 l列
        return cmn(n,c)*cmn(n,l);
    }
    private int cmn(int n,int m){
        if(m==0){
            return 1;
        }
        return f(n)/(f(m)*f(n-m));
    }
    // 计算阶乘
    private int f(int n){
        int res = 1;
        while(n>1){
            res*=n;
            n--;
        }
        return res;
    }
}
